package edu.utwente.sem.hrs.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import edu.utwente.sem.hrs.model.Bed.BedType;

public class Kamer
{

  public static void main(String[] args)
  {
    Bed b = new Bed(BedType.EENPERSOONS);
    Bed b2 = new Bed(BedType.TWEEPERSOONS);
    HashSet<Bed> bedden = new HashSet<Bed>();
    bedden.add(b);
    bedden.add(b2);

    Kamer k = new Kamer(2, 5, 125.0, false, bedden);
    System.out.println(k);
  }

  private int kamernummer;
  private int kwaliteit;
  private double prijsPerDag;
  private boolean magGerooktWorden;
  private Set<Bed> bedden;
  private Set<Reservering> reserveringen;
  
  /**
   * Geeft een verzamelign van alle reserveringen van de kamer terug
   * @return alle reserveringen
   */
  public Set<Reservering> getReserveringen()
  {
    return reserveringen;
  }

  public Kamer(int kamernummer, int kwaliteit, double prijsPerDag,
      boolean magGerooktWorden, Set<Bed> bedden)
  {
    this.kamernummer = kamernummer;
    this.kwaliteit = kwaliteit;
    this.prijsPerDag = prijsPerDag;
    this.magGerooktWorden = magGerooktWorden;
    this.bedden = new HashSet<Bed>(bedden);
    this.reserveringen = new HashSet<Reservering>();
  }
/**
 * geeft alle bedden van deze kamer terug
 * @return alle bedden van deze kamer in een Set
 */
  public Set<Bed> getBedden()
  {
    return bedden;
  }
/**
 * geeft het kamernummer terug
 * @return het kamernummer
 */
  public int getKamernummer()
  {
    return kamernummer;
  }
/**
 * geeft de kwaliteit van de kamer terug
 * @return de kwaliteit van de kamer
 */
  public int getKwaliteit()
  {
    return kwaliteit;
  }
/**
 * geeft de prijs per dag van de kamer terug
 * @return de prijs per dag van de kamer
 */
  public double getPrijsPerDag()
  {
    return prijsPerDag;
  }
  /**
   * geeft terug of er gerookt mag worden
   * @return of er gerookt mag worden
   */
  public boolean magGerooktWorden()
  {
    return magGerooktWorden;
  }

  @Override
  public String toString()
  {
    String s = "Kamer [";
    s += "kamernummer: " + kamernummer;
    s += ", kwaliteit: " + kwaliteit;
    s += ", prijsPerDag: " + prijsPerDag;
    s += ", magGerooktWorden: " + magGerooktWorden;
    s += ", Bedden [";
    for (Bed b : bedden)
    {
      s += b.toString() + ", ";
    }
    s = s.substring(0, s.length() - 2);
    s += "]";

    if (!reserveringen.isEmpty())
    {
      s += ", Reserveringen [";
      for (Reservering r : reserveringen)
      {
        s += r + ", ";
      }
      s = s.substring(0, s.length()-2);
      s += "]";
    }
    s += "]";
    return s;
  }
  /**
   * controlleerd of deze kamer beschikbaar is in de gegeven periode
   * @param van de datum vanaf wanneer de kamer gereserveerd moet zijn
   * @param tot de datum tot waneer de kamer gereserveerd moet zijn
   * @return of de kamer beschikbaar is
   */
  public boolean isBeschikbaar(Date van, Date tot)
  {
    boolean beschikbaar = true;
    if(van.after(tot))
    {
      Date tmp = van;
      van = tot;
      tot = tmp;
    }
    for (Reservering r : reserveringen)
    {
      if ((!r.getVan().after(van) && r.getTot().after(van)) || // start in gevraagde periode 
          (r.getVan().before(tot) && !r.getTot().before(tot)) || // eindigt in gevraagde periode
          (!r.getVan().after(van) && !r.getTot().before(tot)) ||
          (!r.getVan().before(van) && !r.getTot().after(tot))) // is voor volledige periode al gereserveerd
      {
        beschikbaar = false;
        break;
      }
    }
    return beschikbaar;
  }

  @Override
  public boolean equals(Object obj)
  {
    if(obj instanceof Kamer)
      return ((Kamer) obj).getKamernummer() == kamernummer;
    else
      return false; 
  }

  @Override
  public int hashCode()
  {
    return kamernummer;
  }

  /**
   * voegt een reservering toe aan de kamer
   * @param r de reservering om toe te voegen
   * @ensure this.isBeschikbaar(r.getVan(), r.getTot) == true
   */
  public void maakReservering(Reservering r)
  {
    reserveringen.add(r);
  }

  /**
   * verwijdert een reservering van deze kamer
   * @param r de reservering om te verwijderen.
   */
  public void verwijderReservering(Reservering r)
  {
    reserveringen.remove(r);
    for(Reservering x : reserveringen)
    {
      System.out.println(x);
    }
  }

}
